package site.jlopen.kuscia.model.task;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import lombok.Getter;
import lombok.Setter;
import site.jlopen.kuscia.model.task.param.SfClusterDesc;
import site.jlopen.kuscia.model.task.param.SfDatasourceConfig;
import site.jlopen.kuscia.model.task.param.SfNodeEvalParam;

@Getter
@Setter
public class TaskInputConfig {

	/**
	 * 表示 SecretFlow 输入输出所需要的节点数据源信息
	 */
	private Map<String, SfDatasourceConfig> sf_datasource_config;
	
	/**
	 * 表示 SecretFlow 集群信息，详情请查阅 SecretFlow 集群文档。
	 * https://www.secretflow.org.cn/docs/secretflow/latest/zh-Hans/component/comp_spec_design#sfclusterdesc
	 * 
	 */
	private SfClusterDesc sf_cluster_desc;
	
	/**
	 * 表示 SecretFlow 算子的详细配置，详情请查阅 SecretFlow 算子运行配置文档。
	 * https://www.secretflow.org.cn/docs/spec/latest/zh-Hans/intro#nodeevalparam
	 */
	private SfNodeEvalParam sf_node_eval_param;
	
	/**
	 * 表示 SecretFlow 输入数据 id，SecretFlow 引擎会将 Kuscia 定义的输入数据 DomainData 转换成引擎所需要的 DistData。
	 */
	private List<String> sf_input_ids;
	
	/**
	 * 表示 SecretFlow 输出数据 id，SecretFlow 引擎会将输出的 DistData 转换成 Kuscia 的 DomainData。
	 */
	private List<String> sf_output_ids;
	
	/**
	 * sf_output_uris：表示 SecretFlow 输出数据路径。
	 */
	private List<String> sf_output_uris;
	
	public TaskInputConfig addDatasourceConfig(String nodeCode, SfDatasourceConfig config) {
		if(null == sf_datasource_config) {
			sf_datasource_config = new HashMap<String, SfDatasourceConfig>();
		}
		sf_datasource_config.put(nodeCode, config);
		return this;
	}
	
	public TaskInputConfig addClusterDesc(SfClusterDesc clusterDesc) {
		sf_cluster_desc = clusterDesc;
		return this;
	}
	
	public TaskInputConfig addNodeEvalParam(SfNodeEvalParam nodeEvalParam) {
		sf_node_eval_param = nodeEvalParam;
		return this;
	}
	
	public TaskInputConfig addInputId(String inputId) {
		if(null == sf_input_ids) {
			sf_input_ids = new ArrayList<String>();
		}
		sf_input_ids.add(inputId);
		return this;
	}
	
	public TaskInputConfig addOutputId(String outputId) {
		if(null == sf_output_ids) {
			sf_output_ids = new ArrayList<String>();
		}
		sf_output_ids.add(outputId);
		return this;
	}
	
	public TaskInputConfig addOutputUri(String fileDirName) {
		if(null == sf_output_uris) {
			sf_output_uris = new ArrayList<String>();
		}
		sf_output_uris.add(fileDirName);
		return this;
	}
	
	public TaskInputConfig addOutput(String fileDirName, String domainDataId) {
		if(null == sf_output_uris) {
			sf_output_uris = new ArrayList<String>();
		}
		if(null == sf_output_ids) {
			sf_output_ids = new ArrayList<String>();
		}
		sf_output_uris.add(fileDirName);
		sf_output_ids.add(domainDataId);
		return this;
	}
}
